/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package conexion;

import conexion.Campo;
import java.util.ArrayList;

/**
 *Clase la cual armara una sentencia Sql, segun la constante que se le  pase cuando la clase sea instanciada, ejemplo
 * SqlFormat sentencia = new SqlFormat(SqlFormat.ACTUALIZAR, clientes);
 *                                      [Modo sentencia]     [Tabla]
 * Luego hay que pasar los campos, se pueden pasar N campos
 * sentencia.addField(  "nombre",  "moises"   );
 *                      [Campo]     [Valor]
 * luego recuperar la sentencia, para usarla donde sea. ( se recupera como String)
 * String sentencia_sql = sentencia.crearInstruccion();
 * @author moises
 */
public class SqlFormat {

    /*Constantes, serviran para elegir el modo en que se armara la consulta*/
    public static  int ELIMINAR = 1;
    public static int ACTUALIZAR = 2;
    public static int INSERTAR = 3;
    public static int CONSULTAR =4;
    public static int SELECCIONAR=5;
    /*en update,insert y delete se guardaran la sentencia segun corresponda*/
    private String update;
    private String insert;
    private String delete;
    /*ArrayList campos, servira para ir almacenando cada campo que se le pase a las instrucciones
     * se toman como campo y valor. Los campos son ingresados con el metodo addField(campo,valor);
     */
    ArrayList<Campo> campos = new ArrayList<Campo>();
    ArrayList<Campo> condiciones = new ArrayList<Campo>(); //En condiciones, se guardaran los  where, dados por 
    //campo y valor. Se pasa cada condicion mediante el metodo Where(campo,condicion);
    
    
    private int accion; //Se guarda la accion, dada por la constante que se pasa por el constructor 
    private String tabla; //Se guarda el nombre de la tabla en la cual se ejecutara la sentencia.
    
//    Campo condicion = new Campo();

    public String getTabla() {
        return tabla;
    }

    public void setTabla(String tabla) {
        this.tabla = tabla;
    }

    public SqlFormat() {
    }

    public SqlFormat(int accion, String tabla) {
        setAccion(accion);
        setTabla(tabla);
    }

    public int getAccion() {
        return accion;
    }

    public void setAccion(int accion) {
        this.accion = accion;

    }

    public void where(String campo, String condicion) {;
        this.condiciones.add(new Campo(campo,"'"+condicion+"'"));
    }

    public void where(String campo, int condicion) {
         this.condiciones.add(new Campo(campo,String.valueOf(condicion)));
    }

    public void addField(String campo, String valor) {
        this.campos.add(new Campo(campo, String.valueOf("'" + valor + "'")));
    }
     public void addField(String campo, char valor) {
        this.campos.add(new Campo(campo, String.valueOf("'" + valor + "'")));
    }

    public void addField(String campo, int valor) {
        this.campos.add(new Campo(campo, String.valueOf(valor)));
    }

    public String crearInstruccion() {
        /*
         * Funcion la cual distinge cual sentencia debe crear, ya sea insert, update o delete.
         * Este metodo devuelve la sentencia final
         * 
         */
        String instruccion=""; //Servira para almacenar la instruccion
        if(this.accion == SqlFormat.ACTUALIZAR)
              instruccion = this.crearActualizar();
        if(this.accion == SqlFormat.INSERTAR)
              instruccion = this.crearInsertar();
        if(this.accion == SqlFormat.ELIMINAR)
            instruccion = this.crearEliminar();
        if(this.accion==SqlFormat.SELECCIONAR)
            instruccion = this.SelectAll();
        
        return instruccion;
    }

    public String crearActualizar() {
        this.update = "update " + this.getTabla() + " set ";
        int contador = 1;
        for (Campo campo : campos) {

            this.update += campo.getCampo() + " = " + campo.getValor() + " ";

            if (contador != campos.size()) //Si es el ultimo objeto, no se le debe agregar coma
                this.update += ", ";//como no es el ultimo objeto, se le agrega coma
            contador++;
        }

        //Se agrega la condicion
        this.update+= this.agregarCondicion();
        
        return this.update;
    }
    
    public String crearInsertar()
    {
        //Agregando parametros 
        this.insert = "insert into " + this.getTabla() + "(";
        int contador = 1;
        for (Campo campo : campos) {

            this.insert += campo.getCampo();

            if (contador != campos.size())  //Si es el ultimo objeto, no se le debe agregar coma
                this.insert += ", ";        //como no es el ultimo objeto, se le agrega coma
            else
                this.insert+=")";
            contador++;
        }
        
        //pasando los parametros dentro del value
        this.insert+=" values(";
        int contador2=1;
         for (Campo campo : campos) {

            this.insert += campo.getValor();

            if (contador2 != campos.size()) //Si es el ultimo objeto, no se le debe agregar coma
                this.insert += ", ";//como no es el ultimo objeto, se le agrega coma
            else
                this.insert+=")";
            contador2++;
        }
         return this.insert;
            
        
    }
    
    
    public String crearEliminar()
    {
        this.delete = "delete from " + this.tabla + " ";
        this.delete+= this.agregarCondicion();
        return this.delete;
    }
    
    public String agregarCondicion()
    {
        /*Agregara cuantas condiciones hayan sido pasadas a la sentencia*/
        String where="where ";
        int contador=1;
        for(Campo campo : condiciones)
        {
            if (contador==1)
                where+= " " + campo.getCampo() + " = " +  campo.getValor();
            else
                where+=" and " + campo.getCampo() + " = " + campo.getValor();
            
            contador++;  
            
        }
        
        return where;
    }
    
    
    public static String SelectAll(String tabla)
    {
        return "select * from ".concat(tabla);
    
    }
    
    public String SelectAll()
    {
       
        String sql = "select * from ".concat(this.tabla);
        
        if(!this.condiciones.isEmpty())
            sql+=" " + this.agregarCondicion(); // Se agregan las condiciones que existan
        
        
        return sql;
    }
    
}
